home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / screen.swg / 0044_More FASTWRITE Routines.pas < prev    next >
Pascal/Delphi Source File  |  1993-11-21  |  2KB  |  70 lines

  1. {$R-}
  2. UNIT FWrite;
  3. (**) INTERFACE (**)
  4. USES Crt;
  5. VAR
  6.   ScreenWidth,
  7.   ScreenHeight : Byte;
  8.  
  9.   PROCEDURE FastWrite(S : String; co, ro, at : Byte);
  10.   PROCEDURE FasterWrite(S:String; co, ro, at : Word);
  11.   PROCEDURE CheckWidthHeight;
  12. (**) IMPLEMENTATION (**)
  13. TYPE
  14.   WordArray = ARRAY[0..65520 DIV 2] OF Word;
  15. VAR
  16.   Display  : ^WordArray;
  17.   Crt_Cols : Word ABSOLUTE $0040:$004A;
  18.   Crt_Rows : Word ABSOLUTE $0040:$0084;
  19.  
  20.   PROCEDURE FastWrite(S : String; co, ro, at : Byte);
  21.   VAR
  22.     Start, WordAttr : Word;
  23.     N : Byte;
  24.   BEGIN
  25.     Start:= pred(ro)*ScreenWidth + pred(co);
  26.     WordAttr := Word(At) SHL 8;
  27.     FOR N := 1 to length(S) DO
  28.       Display^[start+pred(N)] := WordAttr + ord(S[N]);
  29.   END;
  30.  
  31.   PROCEDURE FasterWrite(S:String; co,
  32.                         ro, at : Word); Assembler;
  33.   ASM
  34.     MOV AX, ro               {                        }
  35.     DEC AL                   { These calculations     }
  36.     SHL AL, 1                { get the initial offset }
  37.     MUL ScreenWidth          { into the AX register   }
  38.     ADD AX, co               {                        }
  39.     DEC AX                   {                        }
  40.     MOV DI, Word(Display)    { DI now points to the   }
  41.     ADD DI, AX               { starting offset.       }
  42.     MOV AX, Word(Display+2)
  43.     MOV ES, AX               { ES has video segment   }
  44.     PUSH DS
  45.     LDS SI, S                { DS:SI points to string }
  46.     XOR CX, CX
  47.     MOV CL, [SI]             { String length in CX    }
  48.     INC SI
  49.     MOV BH, Byte(At)         { Attribute in BH        }
  50.     @Loop:
  51.       MOVSB                  { Move a char to screen  }
  52.       MOV ES:[DI], BH        { .. and its attribute   }
  53.       INC DI
  54.     Loop @Loop
  55.     POP DS
  56.   END;
  57.  
  58.   PROCEDURE CheckWidthHeight;
  59.   BEGIN
  60.     ScreenWidth := Crt_Cols;
  61.     ScreenHeight := succ(Crt_Rows);
  62.   END;
  63.  
  64. (** INITIALIZATION **)
  65. BEGIN
  66.   CheckWidthHeight;
  67.   IF LastMode = 7 THEN
  68.     Display := Ptr($B000, 0)
  69.   ELSE Display := Ptr($B800, 0);
  70. END.